From: Colin Walters Date: Wed, 4 Jun 2014 22:21:32 +0000 (-0400) Subject: libostree: Silently ignore EPERM when setting EXT2_IMMUTABLE_FL X-Git-Tag: archive/raspbian/2022.1-3+rpi1~1^2~1177 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=e31daf448afdaec9e692612ae522c7d89bf8be28;p=ostree.git libostree: Silently ignore EPERM when setting EXT2_IMMUTABLE_FL In the case of running ostree as non-root on a regular filesystem (not tmpfs which doesn't support immutable), we should just silently do nothing if we encounter EPERM. Cache the result to avoid spam in strace. https://bugzilla.gnome.org/show_bug.cgi?id=728006 --- diff --git a/src/libostree/ostree-linuxfsutil.c b/src/libostree/ostree-linuxfsutil.c index 8e11d2cf..2bfc92f2 100644 --- a/src/libostree/ostree-linuxfsutil.c +++ b/src/libostree/ostree-linuxfsutil.c @@ -38,8 +38,9 @@ * Alter the immutable flag of object referred to by @fd; may be a * regular file or a directory. * - * If the operation is not supported by the underlying filesystem, - * this function will silently do nothing. + * If the operation is not supported by the underlying filesystem, or + * we are running without sufficient privileges, this function will + * silently do nothing. */ gboolean _ostree_linuxfs_fd_alter_immutable_flag (int fd, @@ -50,12 +51,18 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd, gboolean ret = FALSE; unsigned long flags; int r; + static gint no_alter_immutable = 0; + + if (g_atomic_int_get (&no_alter_immutable)) + return TRUE; r = ioctl (fd, EXT2_IOC_GETFLAGS, &flags); if (r == -1) { int errsv = errno; - if (errsv == EOPNOTSUPP || errsv == ENOTTY) + if (errsv == EPERM) + g_atomic_int_set (&no_alter_immutable, 1); + else if (errsv == EOPNOTSUPP || errsv == ENOTTY) ; else { @@ -75,7 +82,9 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd, if (r == -1) { int errsv = errno; - if (errsv == EOPNOTSUPP || errsv == ENOTTY) + if (errsv == EPERM) + g_atomic_int_set (&no_alter_immutable, 1); + else if (errsv == EOPNOTSUPP || errsv == ENOTTY) ; else {